// 文件转base64
export async function file2Base64(file) {
  const reader = new FileReader()

  const result = new Promise((resolve) => {
    reader.addEventListener('load', () => resolve(reader.result))
  })

  reader.readAsDataURL(file)

  return result
}
// 上传文件
export function uploadFile(fn) {
  const input = document.createElement('input')
  input.setAttribute('type', 'file')
  input.click()
  input.onchange = function () {
    fn?.(input.files[0])
  }
}
// 下载文件
export function downloadFile(fileBits, name = '') {
  const file = new File([fileBits], name)
  const url = URL.createObjectURL(file)
  const a: any = document.createElement('A')
  a.download = name
  a.href = url
  a.click()
  URL.revokeObjectURL(url)
}
//element display=none 获取不到真实值
function getComputedStyleValue(element, attr) {
  const value = window.getComputedStyle(element).getPropertyValue(attr)
  return value
}

// 根据设计尺寸获取自适应尺寸   num: 设计尺寸像素 totalWidth: 设计总宽度
function getAdaptiveSize(num, totalWidth) {
  return parseInt((num * window.innerWidth) / totalWidth)
}

function getProperty(object, keyStr) {
  const keyArr = keyStr.split('.')
  let obj = object

  for (const key of keyArr) {
    obj = obj[key]

    if (obj === undefined) return obj
  }

  return obj
}

// 通过pid转树数据
function arr2Tree(inArr) {
  const outArr = []

  function handle(arr, pid) {
    arr.push(...inArr.filter((i) => i.pid == pid))
    if (arr.length > 0) arr.forEach((i) => handle((i.children = []), i.id))
  }

  handle(outArr, '')

  return outArr
}

//时间格式化
function dateTimeFormat(date: Date) {
  return Intl.DateTimeFormat('zh-CN', {
    dateStyle: 'short',
    timeStyle: 'medium',
    hour12: false
  }).format(date)
}

//转base64
async function toBase64(file) {
  const reader = new FileReader()
  const result = new Promise((resolve) => {
    reader.addEventListener(
      'load',
      function () {
        resolve(reader.result)
      },
      false
    )
  })

  if (file) {
    reader.readAsDataURL(file)
    return result
  }
}

// 深拷贝（不包含函数）
function deepClone(obj, map = new Map()) {
  if (window.structuredClone) {
    try {
      return structuredClone(obj)
    } catch (err) {
      // console.log(err)
    }
  }

  let newobj = null
  if (typeof obj == 'object' && obj !== null) {
    if (map.get(obj)) {
      newobj = map.get(obj) // 如果不想循环打印 可以设置为null
    } else {
      newobj = obj instanceof Array ? [] : {}
      map.set(obj, newobj)
      for (const i in obj) {
        newobj[i] = deepClone(obj[i], map)
      }
    }
  } else {
    newobj = obj
  }
  return newobj
}

// uuid
function generateUUID() {
  if (window.crypto?.randomUUID) return crypto.randomUUID()

  const _lut = [
    '00',
    '01',
    '02',
    '03',
    '04',
    '05',
    '06',
    '07',
    '08',
    '09',
    '0a',
    '0b',
    '0c',
    '0d',
    '0e',
    '0f',
    '10',
    '11',
    '12',
    '13',
    '14',
    '15',
    '16',
    '17',
    '18',
    '19',
    '1a',
    '1b',
    '1c',
    '1d',
    '1e',
    '1f',
    '20',
    '21',
    '22',
    '23',
    '24',
    '25',
    '26',
    '27',
    '28',
    '29',
    '2a',
    '2b',
    '2c',
    '2d',
    '2e',
    '2f',
    '30',
    '31',
    '32',
    '33',
    '34',
    '35',
    '36',
    '37',
    '38',
    '39',
    '3a',
    '3b',
    '3c',
    '3d',
    '3e',
    '3f',
    '40',
    '41',
    '42',
    '43',
    '44',
    '45',
    '46',
    '47',
    '48',
    '49',
    '4a',
    '4b',
    '4c',
    '4d',
    '4e',
    '4f',
    '50',
    '51',
    '52',
    '53',
    '54',
    '55',
    '56',
    '57',
    '58',
    '59',
    '5a',
    '5b',
    '5c',
    '5d',
    '5e',
    '5f',
    '60',
    '61',
    '62',
    '63',
    '64',
    '65',
    '66',
    '67',
    '68',
    '69',
    '6a',
    '6b',
    '6c',
    '6d',
    '6e',
    '6f',
    '70',
    '71',
    '72',
    '73',
    '74',
    '75',
    '76',
    '77',
    '78',
    '79',
    '7a',
    '7b',
    '7c',
    '7d',
    '7e',
    '7f',
    '80',
    '81',
    '82',
    '83',
    '84',
    '85',
    '86',
    '87',
    '88',
    '89',
    '8a',
    '8b',
    '8c',
    '8d',
    '8e',
    '8f',
    '90',
    '91',
    '92',
    '93',
    '94',
    '95',
    '96',
    '97',
    '98',
    '99',
    '9a',
    '9b',
    '9c',
    '9d',
    '9e',
    '9f',
    'a0',
    'a1',
    'a2',
    'a3',
    'a4',
    'a5',
    'a6',
    'a7',
    'a8',
    'a9',
    'aa',
    'ab',
    'ac',
    'ad',
    'ae',
    'af',
    'b0',
    'b1',
    'b2',
    'b3',
    'b4',
    'b5',
    'b6',
    'b7',
    'b8',
    'b9',
    'ba',
    'bb',
    'bc',
    'bd',
    'be',
    'bf',
    'c0',
    'c1',
    'c2',
    'c3',
    'c4',
    'c5',
    'c6',
    'c7',
    'c8',
    'c9',
    'ca',
    'cb',
    'cc',
    'cd',
    'ce',
    'cf',
    'd0',
    'd1',
    'd2',
    'd3',
    'd4',
    'd5',
    'd6',
    'd7',
    'd8',
    'd9',
    'da',
    'db',
    'dc',
    'dd',
    'de',
    'df',
    'e0',
    'e1',
    'e2',
    'e3',
    'e4',
    'e5',
    'e6',
    'e7',
    'e8',
    'e9',
    'ea',
    'eb',
    'ec',
    'ed',
    'ee',
    'ef',
    'f0',
    'f1',
    'f2',
    'f3',
    'f4',
    'f5',
    'f6',
    'f7',
    'f8',
    'f9',
    'fa',
    'fb',
    'fc',
    'fd',
    'fe',
    'ff'
  ]
  const d0 = (Math.random() * 0xffffffff) | 0
  const d1 = (Math.random() * 0xffffffff) | 0
  const d2 = (Math.random() * 0xffffffff) | 0
  const d3 = (Math.random() * 0xffffffff) | 0
  const uuid =
    _lut[d0 & 0xff] +
    _lut[(d0 >> 8) & 0xff] +
    _lut[(d0 >> 16) & 0xff] +
    _lut[(d0 >> 24) & 0xff] +
    '-' +
    _lut[d1 & 0xff] +
    _lut[(d1 >> 8) & 0xff] +
    '-' +
    _lut[((d1 >> 16) & 0x0f) | 0x40] +
    _lut[(d1 >> 24) & 0xff] +
    '-' +
    _lut[(d2 & 0x3f) | 0x80] +
    _lut[(d2 >> 8) & 0xff] +
    '-' +
    _lut[(d2 >> 16) & 0xff] +
    _lut[(d2 >> 24) & 0xff] +
    _lut[d3 & 0xff] +
    _lut[(d3 >> 8) & 0xff] +
    _lut[(d3 >> 16) & 0xff] +
    _lut[(d3 >> 24) & 0xff]

  // .toLowerCase() here flattens concatenated strings to save heap memory space.
  return uuid.toLowerCase()
}

export {
  getComputedStyleValue,
  getAdaptiveSize,
  getProperty,
  arr2Tree,
  dateTimeFormat,
  toBase64,
  deepClone,
  generateUUID
}
